﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using wpfArVideo;
using WindowsFormsApplication1;
using FormularioLogin;
using ModuloPartidas;
using System.Net;
using Ionic.Zip;
namespace WindowsFormsApplication1
{
    public partial class InitGymkana : Form
    {
        /** 
         * una variable para guardar el usuario que esta iniciando 
         * la sesión
         **/
        private string current_user = null;
        private ARBDDataContext bd = new ARBDDataContext();
        const string no = "No";
        private wpfArVideo.ventanaInicio.interfazInicio inter;

        public InitGymkana(string user, wpfArVideo.ventanaInicio.interfazInicio i)
        {
            try
            {
                this.Refresh();
                InitializeComponent();
                this.inter = i;
                SelectParty.Enabled = false;
                this.current_user = user;
                var q = from t in bd.partidas
                        select t;
                if (q != null)
                {
                    List<partida> lp = q.ToList<partida>();
                    foreach (partida p in lp)
                    {
                        SelectPartyBox.Items.Add(p.nombre);

                    }
                }
            }
            catch (System.Data.SqlClient.SqlException exp)
            {

                MessageBox.Show("Error de base de datos");
                this.Close();
            }

            //cargamos el número de participantes máximo*/
            timer2.Start();

 
        }

        public void clearParty(bool resetAll)
        {
            PartyBox.Text = "";
            NumJugBox.Value = 1;
            if (resetAll)
            {
                this.label5.Text = "0";
                this.label7.Text = "0";
                SelectPartyBox.SelectedItem = null;
                SelectPartyBox.Items.Clear();
                PartyBox.Clear();
                this.JugadoresPartidaBox.Items.Clear();
                timer1.Enabled = true;
                timer2.Enabled = true;
            }
        }

        private void SALIR_Click(object sender, EventArgs e)
        {
            Jugador j = new Jugador();
            j.salir(current_user);
            this.inter.Show();
            Close();
        }

        private void SelectParty_Click(object sender, EventArgs e)
        {

            try
            {
                this.BJugar.Enabled = true;
                string partidaseleccionada = this.SelectPartyBox.SelectedItem.ToString();
                Jugador j = new Jugador();
                bool delete=j.abandonar(this.current_user);
                if (delete) UpdatePlayerList();
                String mensajeError = j.seleccionarPartida(partidaseleccionada, current_user);

                if (mensajeError != null)
                {
                    MessageBox.Show(mensajeError, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    clearParty(false);
                }

            }
            catch (System.Data.SqlClient.SqlException exp)
            {

                MessageBox.Show("Error de base de datos");
                this.Close();
            }
           
        }

        private void Download(string URL)
        {
            //WebClient web = new WebClient();
            //web.DownloadFile(URL, "xaml.zip");            
            //Ionic.Zip.ZipFile zip = new ZipFile("xaml.zip");
            //zip.ExtractAll(".", ExtractExistingFileAction.OverwriteSilently);         
        }


        private void Create_Click(object sender, EventArgs e)
        {
            try
            {
                string nombrePartida, tipo;
                int participantes;
                string mensajeError;

                Partida p = new Partida();

                nombrePartida = PartyBox.Text;
                participantes = (int)NumJugBox.Value;
                tipo = (String)TipoPartidoBox.SelectedItem;

                mensajeError = p.CrearPartida(nombrePartida, participantes, tipo, this.current_user);
                if (mensajeError != null)
                {
                    MessageBox.Show(mensajeError, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    clearParty(false);
                }
                else
                {

                    object obj = this.SelectPartyBox.SelectedItem;
                    timer1_Tick(null, null);
                    this.SelectPartyBox.SelectedIndex = this.SelectPartyBox.Items.IndexOf(nombrePartida);

                }

            }
            catch (System.Data.SqlClient.SqlException exp)
            {

                MessageBox.Show("Error de base de datos");
                this.Close();
            }
        }

        private void SelectPartyBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (this.SelectPartyBox.SelectedItem != null)
                {
                    ARBDDataContext bd = new ARBDDataContext();
                    string partidaseleccionada = this.SelectPartyBox.SelectedItem.ToString();

                    var q = from p in bd.partidas
                            where p.nombre == partidaseleccionada
                            select p;
                    if (q != null)
                    {
                        partida party = q.FirstOrDefault();
                        PartyBox.Text = party.nombre;
                        //PartyBox.Enabled = false ;
                        NumJugBox.Value = party.num_jugadores;
                        //NumJugBox.Enabled = false;
                        TipoPartidoBox.SelectedItem = party.tipo;
                        //TipoPartidoBox.Enabled = false;
                        SelectParty.Enabled = true;
                    }



                    UpdatePlayerList();
                }
            }
            catch (System.Data.SqlClient.SqlException exp)
            {

                MessageBox.Show("Error de base de datos");
                this.Close();
            }
            
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

            UpdatePlayerList();

        }

        private void UpdatePlayerList()
        {
            try
            {

                ARBDDataContext bd = new ARBDDataContext();

                Object obj = this.SelectPartyBox.SelectedItem;
                var q = from t in bd.partidas
                        select t.nombre;
                if (q != null)
                {
                   
                        List<string> l = q.ToList<string>();
                        SelectPartyBox.BeginUpdate();
                        try
                        {
                        foreach (string s in SelectPartyBox.Items)
                        {
                            if (!l.Contains(s)) SelectPartyBox.Items.Remove(s);

                        }

                        foreach (string s in l)
                        {
                            if (!SelectPartyBox.Items.Contains(s))
                                SelectPartyBox.Items.Add(s);

                        }
                        if (obj!=null&&!SelectPartyBox.Items.Contains(obj)) obj = null; ;
                        SelectPartyBox.SelectedItem = obj;
                        SelectPartyBox.SelectedIndexChanged -= null;
                        SelectPartyBox.EndUpdate();
                    }
                    catch (InvalidOperationException exp)
                    {
                        SelectPartyBox.EndUpdate();
                        UpdatePlayerList();
                    }

                }
            }
            catch (System.Data.SqlClient.SqlException exp)
            {

                MessageBox.Show("Error de base de datos");
                this.Close();
            }
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            try
            {
                this.JugadoresPartidaBox.Items.Clear();
                ARBDDataContext bd = new ARBDDataContext();
                string s = null;
                if (this.SelectPartyBox.SelectedItem != null)
                {

                    s = this.SelectPartyBox.SelectedItem.ToString();
                }
                else return;
                var q = from p in bd.participacions
                        where p.Id_partida == s
                        select p;

                int contador = 0;
                List<participacion> l = q.ToList<participacion>();
                foreach (participacion k in l)
                {
                    JugadoresPartidaBox.Items.Add(k.Usuario);
                    contador++;
                }

                var q2 = from p2 in bd.partidas
                         where p2.nombre == s
                         select p2.num_jugadores;

                label7.Text = q2.First<decimal>().ToString();

                label5.Text = contador.ToString();
            }
            catch (System.Data.SqlClient.SqlException exp)
            {

                MessageBox.Show("Error de base de datos");
                this.Close();
            }
        }

        private void Salir_Click(object sender, EventArgs e)
        {
             WindowsFormsApplication1.InitGymkana Ini = new WindowsFormsApplication1.InitGymkana(this.current_user, inter);
            Ini.Show();
            Close();
        }

        private void BJugar_Click(object sender, EventArgs e)
        {
            try
            {
                this.BJugar.Enabled = false;
                ARBDDataContext bd = new ARBDDataContext();

                Jugador j = new Jugador();
                j.jugar(current_user);

                var q = (from p in bd.participacions
                         where p.Usuario == current_user
                         select p);

                participacion parti = q.First<participacion>();

                var q2 = (from p2 in bd.participacions
                          where p2.Id_partida == parti.Id_partida
                          select p2).Count();

                int contador = (int)q2;

                var q3 = from p3 in bd.partidas
                         where p3.nombre == parti.Id_partida
                         select p3;

                partida par = q3.First<partida>();

                if (contador == par.num_jugadores)
                {
                    bool empezar = false;
                    while (!empezar)
                    {

                        List<participacion> aux =
                         (from p4 in bd.participacions
                          where p4.Id_partida == parti.Id_partida
                          select p4).ToList<participacion>();
                        bd.Refresh(System.Data.Linq.RefreshMode.KeepChanges, bd.participacions);
                        empezar = true;
                        foreach (participacion i in aux)
                        {
                            if (i.listo == "No")
                            {
                                empezar = false;
                            }
                        }
                    }

                    /*seleccionamos el tipo de partida para descargar las pruebas que le correspondan*/
                    var q5 = from p5 in bd.tipo_partidas
                             where p5.tipo == par.tipo
                             select p5.ruta_pruebas;
                    string URL = q5.First<string>();
                    Download(URL);

                    /*abrimos la interfaz del juego*/
                    wpfArVideo.ventanaJuego.interfazJuego v = new wpfArVideo.ventanaJuego.interfazJuego(this.SelectPartyBox.SelectedItem.ToString(), this.current_user, this.inter, this);
                    timer1.Enabled = false;
                    timer2.Enabled = false;
                    v.Show();
                    Hide();
                    this.BJugar.Enabled = false;
                }
                else
                {
                    DialogResult res =
                      MessageBox.Show("Faltan jugadores en la partida",
                                      "Party Error",
                                       MessageBoxButtons.OK,
                                       MessageBoxIcon.Error);
                }
            }
            catch (System.Data.SqlClient.SqlException exp)
            {

                MessageBox.Show("Error de base de datos");
                this.Close();
            }
        }

        private void InitGymkana_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                Jugador j = new Jugador();
                j.abandonar(current_user);
              
            }
            catch (System.Data.SqlClient.SqlException exp)
            {

                MessageBox.Show("Error de base de datos");
                this.Close();
            }
        }

       

    }
}

